﻿// 缓存数据
var tempData = {};
//是否无匹配数据
var noData= false;
(function($) {
	$.fn.autoComplete = function(config) {
		var timeid;
		var lastValue;
		var options;
		var c = $(this);
		var d;
		var t;
		var headerPropertys = new Array();

		var defaults = {
			offset:0,
			width : c.width(), // 提示框的宽度 默认跟文本框一样
			maxheight : 264, // 提示框的最大高度
			top : 0, // 与文本框的上下距离
			header : null, // 标题文字
			url : "", // ajax 请求地址
			type : "post", // ajax 请求类型
			async : true, // 是否异步请求
			autoLength : 0, // 文本长度大于0 就请求服务器
			businame:'bill',// 业务名称 bill:获取商品 cs:获取客户或供应商 
			getValue : function(value) {
			}, // 当回车 或 鼠标点击选中值的时候执行
			// clearValue: function () { }, //当重新请求时清空Value值
			selected : function(text) {
			}, // 当回车 或 鼠标点击选中值的时候执行
			canceled : function() {
			} // 取消选择的时候执行
		};
		options = $.extend(defaults, config);
		var p = c.position();
		d = $('<div class="autoCompleteBox"></div>');
		d.attr("id", "autoComplete_Group_" + Math.random());
		c.after(d);
		d.css({
			"left" : p.left +options.offset,
			"top" : p.top + c.height() + options.top,
			"width" : options.width,
			"max-height" : options.maxheight,
			"margin-top" : 10,
			"z-index" : 1000
		});
		t = $('<table cellspacing="0" cellpadding="5"></table>');

		var htdiv = $('<div></div>');

		d.append(htdiv);
		d.append(t);

		c.unbind("keydown").bind("keydown", keydown_process);
		c.unbind("keyup").bind("keyup", keyup_process);
		c.unbind("blur").bind("blur", blur_process);
		d.unbind("focus").bind("focus", focus_div);
		d.unbind("mouseout").bind("mouseout", mouseout_div);

		function blur_process() {
			options.canceled();
			timeid = setTimeout(function() {
				 d.hide();
			}, 200);
		}
		;

		function mouseout_div() {
			/*t.find(".nowRow").removeClass("nowRow");
			$(this).find('td').css({
				'background' : '#FFFFFF',
				'border-bottom' : 'soild 1px #d7d7d7'
			});*/
		}
		;

		function focus_div() {
			clearTimeout(timeid);
			c.focus();
		}
		;

		function keydown_process(e) {
			if (d.is(":hidden")) {
				return;
			}
			switch (e.keyCode) {
			case 38:
				e.preventDefault();
				var p = t.find(".nowRow").prev();
				if (p.length > 0) {
					d.setScroll(options.maxheight, p, d);
					d.setHeaderTop(htdiv);
					//p.mouseover();
					
					t.find(".nowRow").removeClass("nowRow");
					t.find('td').css({
						'background' : '#FFFFFF',
						'border-bottom' : 'soild 1px #d7d7d7'
					});
					$(p).addClass("nowRow");
					$(p).find('td').css({
						'background' : '#ecf4ff',
						'border-bottom' : 'soild 1px #bdd1eb'
					});
					
				} else {
					p = t.find("tr:last");
					if (p.length > 0) {
						d.setScroll(options.maxheight, p, d);
						d.setHeaderTop(htdiv);
						//p.mouseover();
						
						t.find(".nowRow").removeClass("nowRow");
						t.find('td').css({
							'background' : '#FFFFFF',
							'border-bottom' : 'soild 1px #d7d7d7'
						});
						$(p).addClass("nowRow");
						$(p).find('td').css({
							'background' : '#ecf4ff',
							'border-bottom' : 'soild 1px #bdd1eb'
						});
						
					}
				}
				return false;
				break;
			case 40:
				e.preventDefault();
				var n = t.find(".nowRow").next();
				if (n.length > 0) {
					d.setScroll(options.maxheight, n, d);
					d.setHeaderTop(htdiv);
					//n.mouseover();
					
					t.find(".nowRow").removeClass("nowRow");
					t.find('td').css({
						'background' : '#FFFFFF',
						'border-bottom' : 'soild 1px #d7d7d7'
					});
					$(n).addClass("nowRow");
					$(n).find('td').css({
						'background' : '#ecf4ff',
						'border-bottom' : 'soild 1px #bdd1eb'
					});
					
				} else {
					n = t.find("tr:first");
					if (n.length > 0) {
						d.setScroll(options.maxheight, n, d);
						d.setHeaderTop(htdiv);
						//n.mouseover();
						
						t.find(".nowRow").removeClass("nowRow");
						t.find('td').css({
							'background' : '#FFFFFF',
							'border-bottom' : 'soild 1px #d7d7d7'
						});
						$(n).addClass("nowRow");
						$(n).find('td').css({
							'background' : '#ecf4ff',
							'border-bottom' : 'soild 1px #bdd1eb'
						});
					}
				}
				return false;
				break;
			case 13:
				e.preventDefault();
				var n = t.find(".nowRow");
				if (n.length > 0) {
					options.selected(StringToJson(n.attr("rowValue")));
					lastValue = "";
					d.hide();
				}
				break;
			}
		}
		;

		function keyup_process(e) {
			if (e.keyCode == 13 || e.keyCode == 38 || (!d.is(":hidden") && e.keyCode == 40) || e.keyCode == 37 || e.keyCode == 39) {
				return true;
			}
			if ( !noData && e.keyCode == 13) {	//无匹配数据 则不执行
				setTimeout(function() {
					e.preventDefault();
					var n = t.find(".nowRow");
					if (n.length > 0) {
						options.selected(StringToJson(n.attr("rowValue")));
						options.lastValue = "";
						d.hide();
					} 
				}, 200);
			} 
			setTimeout(function() {
				if(c.val() == ""){
					options.lastValue = "";
					d.hide();
					return;
				}
				if (options.lastValue != c.val()) {
					if (c.val() == "" || c.val().length > options.autoLength) {
//						if (c.val() != "" && c.val() == options.lastValue) {
//							return; // 判断是否跟上一次的值相等, 考虑到用户正在打字 避免相同的值多次请求
//						}
						
						if (options.setPageParams) {
							var ppp = eval(options.setPageParams);
							options.Params =ppp;
						}
						var datatemp = tempData[escape(requestByUrl(options.url,options.Params) +options.businame+c.val())];
						if (datatemp != undefined) {
							processdata(datatemp,options.Params);
						} else {
							getData(c,options.Params, function(data) {
								processdata(data,options.Params);
							});
						}
						options.lastValue = c.val(); // 记录请求值

						// 重新构造表头
						if (t.find("thead>th").length > 0) {
							/*
							 * htdiv.css({ "position" : "absolute", "background" :
							 * "#FF0000" }); htdiv.children().remove(); var ht = $('<table
							 * cellspacing="0" cellpadding="5"></table>'); var t_head =
							 * $('<thead></thead>');
							 * t.find("thead>th").each(function() { var thd = $("<th>" +
							 * $(this).html() + "</th>"); thd.css({ "height" :
							 * $(this).height(), "width" : $(this).width() });
							 * t_head.append(thd); }); ht.append(t_head);
							 * htdiv.append(ht);
							 */
						}
					} else {
						options.lastValue = "";
						d.hide();
					}
				}
			}, 200);
		}
		;
		function processdata(data,Params) {
			if(c.val().trim()==""){
				return;
			}
			if (data.rows == null || data.rows.length == 0 || data.keyword != c.val()) {
				// c.val(lastValue);
				d.hide();
				//showErrorMsg("未匹配到相应的数据");
				noData= true;
				return;
			}
			noData= false;
			// 缓存数据
			tempData[escape(requestByUrl(options.url,Params)+options.businame+c.val())] = data;
			// 构造标题行
			if (options.header != null && t.find("thead").length == 0) {
				headerPropertys.length = 0;
				var thead = $('<thead></thead>');
				for ( var p in options.header) {
					if (typeof (options.header[p]) != "function") {
						thead.append("<th>" + options.header[p] + "</th>");
						headerPropertys.push(p);
					}
				}
				t.append(thead);
			}
			// 构造内容列表行
			t.find("tr").remove();
			$
					.each(
							data.rows,
							function() {
								var tr = $("<tr></tr>");
								tr.attr("rowValue", JsonToString(this));
								if (headerPropertys.length > 0) {
									for (var i = 0; i < headerPropertys.length; i++) {
										tr
												//.append("<td style=\"background:#FFFFFF;border-bottom:soild 1px #d7d7d7;\" onmouseover=\"$(this).parent().find('td').css({'background':'#f4f4f4','border-bottom':'soild 1px #bdd1eb'})\" onmouseout=\"$(this).parent().find('td').css({'background':'#FFFFFF','border-bottom':'soild 1px #d7d7d7'})\">"
												.append("<td style=\"background:#FFFFFF;border-bottom:soild 1px #d7d7d7;\">"
														+ KeyHighlight(
																this[headerPropertys[i]],
																c.val())
														+ "</td>");
									}
								} else {
									for ( var p in this) {
										if (typeof (this[p]) != "function") {
											tr.append("<td>" + this[p]
													+ "</td>");
										}
									}
								}
								t.append(tr);
							});
			var rows = t.find("tr");
			rows.first().addClass("nowRow");
			
			rows.first().find('td').css({'background':'#ecf4ff','border-bottom':'soild 1px #bdd1eb'});
			rows.mouseover(function() {
				$(this).find('td').css({
					'background' : '#f4f4f4',
					'border-bottom' : 'soild 1px #bdd1eb'
				});
			});
			rows.mouseout(function() {
				var thisclass=$(this).attr("class");
				if(thisclass==undefined || thisclass.indexOf("nowRow")<0){
					$(this).find('td').css({
						'background' : '#ffffff',
						'border-bottom' : 'soild 1px #bdd1eb'
					});
				}else{
					$(this).find('td').css({
						'background':'#ecf4ff','border-bottom':'soild 1px #bdd1eb'
					});
				}
			});
			rows.click(function() {
				options.selected(StringToJson($(this).attr("rowValue")));
				options.lastValue = "";
				d.hide();
			});
			c.setBoxPosition(c, d, options.top,options.offset);
			d.show();
			/*if(data.rows != null && data.rows.length == 1)
			{
//				e.preventDefault();
				var n = t.find(".nowRow");
				if (n.length > 0) {
					options.selected(StringToJson(n.attr("rowValue")));
					options.lastValue = "";
					d.hide();
				}
			}*/
		}
		;

		function getData(o, Params,process) {
			var param = {
				"key": o.val() 
			};
			if (Params !=null && Params.length) {
				for (var pi = 0; pi < Params.length; pi++) {
					param[Params[pi].name] =Params[pi].value;
				}
			}
		 
			$.ajax({
				type : options.type,
				async : options.async, // 控制同步
				url : options.url,
				data : param,
				dataType : "json",
				cache : false,
				success : process,
				Error : function(err) {
					alert(err);
				}
			});
		}
		;
	};

	// JSON数据转换为字符串
	function JsonToString(value) {
		return JSON.stringify(value);
		/*
		 * var arr = []; var fmt = function (s) { if (typeof s == 'object' && s !=
		 * null) { //alert(typeof s); return JsonToString(s); } if (s == null) {
		 * s = ""; } s = s.toString().replace(/'/g, "\\\'").replace(/\"/g,
		 * "\\\""); return /^(string|number)$/.test(typeof s) ? "'" + s + "'" :
		 * s; }; for (var i in value) { arr.push("'" + i + "':" +
		 * fmt(value[i])); } return '{' + arr.join(',') + '}';
		 */
	}
	;
	// 字符串转换为JSON数据
	function StringToJson(value) {
		eval("var jsonValue = " + value);
		return jsonValue;
	}
	;
	// 关键字高亮
	function KeyHighlight(strSource, strKey) {
		if ("" == strKey.replace(/ /g, "").replace(/　/g, "")) {
			return strSource;
		}
		var htmlReg = new RegExp("\<.*?\>", "i");
		var arrA = new Array();
		// 替换HTML标签
		for (var i = 0; true; i++) {
			var m = htmlReg.exec(strSource);
			if (m) {
				arrA[i] = m;
			} else {
				break;
			}
			strSource = strSource.replace(m, "{[(" + i + ")]}");
		}
		words = unescape(strKey.replace(/\+/g, ' ')).split(/\s+/);
		// 替换关键字
		for (w = 0; w < words.length; w++) {
			var r = new RegExp("("
					+ words[w].replace(/[(){}.+*?^$|\\\[\]]/g, "\\$&") + ")",
					"ig");
			if (strSource == null) {
				strSource = "";
			}
			strSource = strSource.toString().replace(r,
					"<span class='key'>$1</span>");
		}
		// 恢复HTML标签
		for (var i = 0; i < arrA.length; i++) {
			strSource = strSource.replace("{[(" + i + ")]}", arrA[i]);
		}
		return strSource;
	}

	$.fn.resetEvent = function(c) {
		c.bind("keydown", keydown_process);
		c.bind("keyup", keyup_process);
		c.bind("blur", blur_process);
		d.bind("focus", focus_div);
		d.bind("mouseout", mouseout_div);
	};

	$.fn.setBoxPosition = function(c, d, top,offset) {
		var p = c.position();
		d.css({
			"left" : p.left +offset,
			"top" : p.top + c.height() + top
		});
	};

	$.fn.setScroll = function(h, o, d) {
		var offset = o.offset();
		var p = d.position();
		if (offset.top - p.top > h - 2) {
			$(this).scrollTop(
					((offset.top - p.top - h) / 25 + 1) * 25
							+ $(this).scrollTop());
		} else {
			if (offset.top - p.top < 25) {
				$(this).scrollTop(0);
			}
		}
	};
	$.fn.setHeaderTop = function(h) {
		h.css("top", $(this).scrollTop());
	};
})(jQuery);

function requestByUrl(url,Params) { 
    var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&");
    var sys_code = null;
    var str ="";
    for (i = 0,j = paraString[i]; i <paraString.length;i++) {
    	var name =j.substring(0, j.indexOf("=")).toLowerCase();
    	var value = j.substring(j.indexOf("=") + 1, j.length);
    	str +=name +value;
    	if(name =="sys_code")
    	{sys_code =value;};
    }
    if (Params !=null && Params.length) {
		for (var pi = 0; pi < Params.length; pi++) {
			str += Params[pi].name +Params[pi].value;
		}
	}
    
    if (sys_code ==null)
    {
    	  return str;
    }else
	{
    	return "sys_code=" +sys_code;
	}
    
    
}